C# SELECT语句中的Linq静态方法

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

我正在与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.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);}}
    }