在 EF 中使用 sql 查询

问题描述 投票:0回答:3

我通过以下方式从数据库获取数据:

 result = (from d in context.FTDocuments
                          join f in context.FTDocFlags on d.ID equals f.DocID into fgrp
                          from x in fgrp.DefaultIfEmpty()
                          where d.LevelID == levelID && x.UserID == userID && d.Status.Equals(DocumentStatus.NEW)
                          select new Entities.Document
                          {
                              ArrivalDate = d.ArrivalDate.Value,
                              BundleReference = d.BundleRef,
                              CreatedDate = d.CreatedDate,
                              CustomerID = d.CustomerID,
                              DocType = d.DocType.Value,
                              GuidID = d.DocGuid,
                              ID = d.ID,
                              LastExportID = d.LastExpID,
                              LevelID = d.LevelID,
                              ProfileID = d.ProfileID,
                              ScanDate = d.ScanDate.Value,
                              ScanOperator = d.ScanOperator,
                              SenderEmail = d.SenderEmail,
                              Status = d.Status,
                              VerifyOperator = d.VerOperator,
                              FlagNo = x == null ? 0 : x.FlagNo,
                              FlagUserID = x == null ? 0 : x.UserID
                          }).ToList();

现在,我尝试使用sql查询来实现这一点:

var test = context.Database.SqlQuery<string>("select *from FTDocument d left outer join FTDocFlag f on d.ID=f.DocID").ToList();

但是出现以下错误:

数据读取器有多个字段。多个字段对于 EDM 原语或枚举类型无效

是否可以使用上面这样的复杂查询?

我使用 EF 6.0。

c# entity-framework linqpad
3个回答
5
投票

您的查询不返回单个字符串。使用方式如下:

var test = context.Database.SqlQuery<Entities.Document>("...");

0
投票

试试这个

const string query = @"select *from FTDocument d left outer join FTDocFlag f on d.ID=f.DocID";

var test = context.Database.SqlQuery<Entity>(query).ToList();

0
投票

在我的回答中,我首先假设了 EntityFramework (ObjectContext),但随后我也添加了 DbContext 的代码。

要查看下面的示例,您可以使用 LinqPad 并通过 Add 连接使用 EntityFramework(ObjectContext) 添加实体框架 DLL。指定连接属性并关闭连接对话框。然后选择连接并运行示例:

void Main() { var context=this; // requires that you selected an EF ObjectContext connection var q=context.ExecuteStoreQuery<FTDocument>( "SELECT * FROM FTDocument WHERE ID = @p0", 1); q.ToList().Dump(); }

它将接受所有类型的 SQL 查询,您可以使用

@p0

@p1
 等参数,并在调用函数 
ExecuteStoreQuery
 时简单地以逗号分隔附加它们。结果将作为 
List<FTDocument>
 返回。要将其转换为 
List<string>
,您需要指定要返回哪个数据库字段 - 或者在每行中创建一个以逗号分隔的字段值列表,例如:

q.Select(s=>s.ID+", "+s.GuidID+", "+s.DocType).ToList().Dump();


相同的示例,但这次使用

EntityFramework (DbContext):

通过

添加连接使用EntityFramework(DbContext V4/V5/V6)添加实体框架DLL。指定连接属性(不要忘记指定AppConfig文件)并关闭连接对话框。然后选择连接并运行示例:

void Main() { var context=this; // requires that you selected an EF DBContext (V4/5/6) connection var q=context.Database.SqlQuery<FTDocument>( "SELECT * FROM FTDocument WHERE ID = @p0", 1); q.ToList().Dump(); }

提示: 在关闭连接对话框之前,单击 测试。如果您知道连接成功,稍后将为您省去麻烦。对于所有想要使用自己的数据库尝试不同 EF 项目的人,这里有一个如何创建它的快速教程。然后只需将上面示例中的 FTDocument

 替换为您选择的不同表(当然是在 SQL 字符串和方括号 
<...>
 内)。

© www.soinside.com 2019 - 2024. All rights reserved.