C# SELECT语句中的Linq静态方法
我正在与EF合作,有一些疑问。这是我的密码C# SELECT语句中的Linq静态方法,c#,entity-framework,linq-to-entities,linq-to-objects,C#,Entity Framework,Linq To Entities,Linq To Objects,我正在与EF合作,有一些疑问。这是我的密码 IEnumerable<Customer> customers = from c in context.Customers select new Customer { ID = c.ID, Name = c.Name, LastName = c.LastName, DepID = c.DepID, Editable = SomeStruct.C
IEnumerable<Customer> customers = from c in context.Customers
select new Customer
{
ID = c.ID,
Name = c.Name,
LastName = c.LastName,
DepID = c.DepID,
Editable = SomeStruct.Check(c.DepID)
}
public struct SomeStruct
{
public static bool Check(int depID)
{
//Here I have some logic
}
}
IEnumerable customers=来自context.customers中的c
选择新客户
{
ID=c.ID,
Name=c.Name,
LastName=c.LastName,
DepID=c.DepID,
可编辑=SomeStruct.Check(c.DepID)
}
公共结构SomeStruct
{
公共静态布尔检查(int depID)
{
//这里我有一些逻辑
}
}
它很好用。
但是,如果我将SomeStruct
声明为class
,它将失败
我的问题是:
假设这是一个运行时问题,在您描述的许多情况下,这是一个参考问题。EF的linq提供程序支持调用类中声明的静态方法(静态或非静态)
希望这对您的代码方法有所帮助。
SomeStruct.Check(c.DepID)
应转换为SQL查询。这描述了类/结构等的行为。这是由于实体框架在类和结构上与这些方法的工作不同。但您可以在客户端执行此检查:
IEnumerable<Customer> customers = from c in context.Customers
select new
{
ID = c.ID,
Name = c.Name,
LastName = c.LastName,
DepID = c.DepID
}
.AsEnumerable()
.Select(d=>new Customer
{
ID = c.ID,
Name = c.Name,
LastName = c.LastName,
DepID = c.DepID,
Editable = SomeStruct.Check(c.DepID)
});
您的代码不能使用linq to实体,这是很容易重复的。任何无法转换为sql的内容都将引发运行时异常。就你而言: NotSupportedException:LINQ to Entities无法识别方法“Boolean Check(Int32)”方法,并且无法将此方法转换为存储表达式 如果您在某个点运行了它,那么这不可能与
struct
或class
差异有关,请参阅
您可能同时更改了其他内容,例如在
选择之前添加ToList()
我是否可以确认:如果SomeStruct
是一个类
,但该方法仍然是静态的
,那么它不起作用-我理解正确吗?如果是,会发生什么?例外情况是什么?当SomeStruct是一个struct时,您真的确定您的代码正常工作吗?能否将ToList()添加到select语句中,并查看是否所有内容都正常工作?
public class Customer{
public int ID{get;set;}
public string Name{get;set;}
public string LastName {get;set;}
public Guid DepID{get;set;}
public bool Editable{get{return SomeStruct.Check(DepID);}}
}