返回首页


你想怎么写的:

User foundUser = context.Users.FirstOrDefault(x =>

    x.Username == "OneUsername" &&

    x.CountryCode == CountryCodeEnum.UK &&

    x.AccessLevel == AccessLevelEnum.Admin &&

    x.Active);


当COUNTRYCODE字符串类型,AccessLevel是一个int和活跃的字符串,可以的"Y??或"N???
在这里完成2个重要的示范。首先,它支持枚举,可以是数值或字符串值。二,支持非正统布尔的"Y??和"N??在Oracle数据库中,可以发现。幕后
如果你是不是真的有兴趣在如何成为可能这样做,你可以跳过前提条件。
在我以前的帖子,我描述了如何添加自定义布尔的支持,类似的"Y??的"N?但我没有真正解释它是如何在幕后。
对于每个属性,我们希望有一个自定义的映射,我们创建了一个复杂类型,成为一个复杂的属性的属性。必须重新命名为新的复杂类型单一的财产价值作为一项公约,所以我们可以为它创建的模板,很容易找到与反思(称为硬编码如果你愿意)。
调整的POCO模板中插入自定义代码生成的类的复杂类型。 overriddennbsp;隐式转换到枚举,运营商之间做比较复杂的类型和枚举,NBSP代码交易对象类,辅助方法,etc.nbsp的方法,从实体开发的复杂类型属性设置模板检查。
对于定制布尔​​映射,POCO的模板调整,以检查DbBool复杂类型的名称,所以没有必要在这里额外的属性。
而最重要的,ObjectSetlt; GT;裹以ObjectSetWrapper,将取代在表达式树,成员属性,直接使用与实际价值的财产,如复杂类型:x.CountryCode = GT,X CountryCode.Value。对于布尔,这将是:x.Active = GT; x.Active.Value ==的"Y??
还有一个EnumMapper,可以处理之间的一个枚举值表达式树将取代转型。为了支持我创建了一个新的属性,使用枚举的字符串值:{C}
EnumMapper将检查属性的枚举映射到值时,将字符串值设置属性时发现,或数值,如果有任何属性。
我希望,涵盖了所有的重要方面。先决条件
不幸的是,我无法找到任何方式做默认EF设计优雅,让我去从{A1},实体开发。它还配备 与他们的的dotConnect产品,为各种数据库的ADO.NET提供程序捆绑在一起。我用它的属性的支持,在模型中。有一个MSSQL的免费版本,但它有一个实体你可以import.nbsp的数量上的限制,我建议你开始创建你的模型,从一开始就与实体开发,我发现了一些兼容性问题,打开时创建了一个模型默认实体框架设计师。
第二个先决条件,你必须使用与Visual Studio默认的T4模板生成的POCO对象。否则(例如,如果你使用发现实体开发的模板)......这是调整提供的服务包括模板EFExtensions包括你。
第三,从github上{A2}下载EFExtensions库的最新版本。弄脏
我们得到我们所需要的一切,让我们开始工作。首先,所有进口到你模型定义的项目下载EFExtensions库。或者你可以得到的项目来源,如果你打算调整它,引用它来代替。
打开实体开发的模型。去GT模型;设置。在左侧有一个树形导航,选择属性。现在,单击添加...找到EFExtensions大会(如果您选择使用它的来源在你的bin \调试dirrectory中搜索项目)。一旦你找到它,点击OK。取消选中的EFExtensions.EnumValueAttribute因为你并不需要它。你应该看到像这样:
{A3的}
下次去要支持枚举属性。右键单击,选择......迁移,在新窗口中默认选择的将是新的复杂类型,而这正是我们需要的。输入一个名称,我建议制定一项公约命名是向"Dblt支持枚举的所有的复杂类型; Namegt;枚举??
{A4纸}
一旦你的财产将被重新命名为复杂类型的名称,点击OK,你并不需要,因此,其重命名为。在Model Explorer下复杂类型找到您刚刚创建的类型和变更名称,它是单一的财产价值,认为公约的。对我来说,它看起来像:
选择复杂类型和属性面板下找到的Attributes属性。选择它并点击(集),在新窗口中选择DbEnumAttribute和指向右边的箭头按钮,点击右边的小按钮,所以它会被添加在所选属性列表。现在在属性列表中,设置目标枚举类型的全名(包括完整的命名空间)。这是要支持复杂的属性的枚举。在我的例子中,它是Experimental.CountryCodeEnum的。图像中可以看到箭头,你必须采取行动。
{A6的}
一旦你点击确定,你可以移动到下一个物业要支持枚举或自定义布尔。
映射映射到Y和N,所有你必须​​做的是创建一个复杂的类型与名称DbBool命名也很看重一个单一的财产,自定义布尔属性。没有必要在这里添加属性。
如果你需要更多的领域,在实体相同的复杂类型映射选择迁移??,然后选择现有的复杂类型。更脏
更改模型,以支持枚举都是很不错的,但你可以稍后完成。现在,我们必须得到真正的肮脏与T4模板生成正确的复杂类型的代码和tonbsp的; automaticallynbsp包装ObjectSets。的"先决条件"一节中提到,POCO的默认模板,你可以找到在Visual Studio提供支持。为支持与其他模板,您可能需要进入EFExtensions.ttinclude和适应它。
在与EFExtensions文件夹发现EFExtensions.ttinclude文件,并与POCO的模板复制到您的目录。你不必把它包括在poject,就让它在同一文件夹。如果不适合你,尝试将它移动到基地的项目文件夹中。
使用默认的POCO模板,你有2。TT文件,一个与。Context.tt结尾。打开那一个,并找到:
using System;

using System.Data.Objects;

using System.Data.EntityClient;


Addnbsp";使用EFExtensions;接下来,替换:{体C3}
:{的C4}
现在打开另一个。在顶部找到:{C5的}添加的EFExtensions.ttinclude:{5233}找到这一行写入复杂类型的类的名称:{C7-}添加代码插入接口,如果复杂类型的属性DbEnumAttribute:{C8的}现在向下滚动,并找到行有region.End();和之后EndNamespace(namespaceName);的东西如:
    region.End();

#>

}

<#

    EndNamespace(namespaceName);

} 
插入WriteDbBoolSupport(复杂);和WriteEnumSupport(复杂);后region.End();{C10的}这是额外的代码将被插入。您可以保存并关闭该文件。几乎有这样的复杂类型的创建,自定义代码,正在生成......还有什么?啊,是的,当你想使用一个枚举的字符串值,像我CountryCodeEnum那样,英国的"英国??美国"美国?所以它不是一个ToString()的映射。以这个字符串值添加到每个枚举常量EnumValueAttribute(价值="无​​论你想要的值,让我们回顾一下我前面的例子??{C}如果不设置该属性的值将是做一个(INT)CountryCodeEnum.USA"相同。 不要忘记添加一个引用到EFExtensions另一个项目,如果你有你的枚举。让我们来谈谈关于使用现在,我的用户实体具有复杂的属性,可以分配和比较,以枚举,或布尔我能做些什么,什么是不可能出实体框架框?轮毂怎么样:{C12的}你见过怎么看起来像,现在的AccessLevelEnum CountryCodeEnum:
public enum AccessLevelEnum

{

    Deny = 0,

    User = 1,

    Admin = 99

}

让我们所有不活动的用户:
IEnumerable inactiveUsers = context.Users.Where(x => !x.Active);



或..来自英国的所有用户:
IEnumerable inactiveUsers = context.Users.Where(x => x.CountryCode == CountryCodeEnum.UK);

和我也可以比较一个字符串值:{C16的}后记
恭喜你,现在你知道如何使用LINQ到实体的枚举。另外,我想提,帮我找到我的解决方案缺少的部分后,由戴维・兰德曼:{A7的}。但不幸的是,提出的解决方案只支持数字类型的枚举。如果您发现任何错误,或要改善的解决方案,你可以做,在github,捐款是appreciated.nbsp;
所有这样说,有乐趣NBSP!;拉杜・帕斯卡尔

回答

评论会员: 时间:2