标签: objectquery

存储库/ IQueryable /查询对象

我正在构建一个存储库,我在很多地方看到过2个不在存储库外暴露IQueryable的原因.

1)首先是因为不同的LINQ提供程序可能表现不同,这种差异应该包含在存储库中.

2)第二是防止服务级别开发人员修改数据库查询,以免意外导致性能问题.

我想问题2只能通过将所有查询逻辑保留在存储库中并且不允许任何形式的外部查询构建来防止?但这对我来说似乎有点不切实际.

问题1似乎可以通过使用数据对象模式来解决.

例如 public IEnumerable<T> FindBy(Query query)

我的问题是,为什么我不仅仅传递一个lambda表达式,因为它与提供者无关,似乎为我提供了与查询对象相同的功能,以及相同的分离级别?

例如 public IEnumerable<T> FindBy(Expression<Func<T,bool>> predicate)

有什么理由不这样做吗?它违反了一些规则吗?最佳做法?我应该知道什么?

c# iqueryable repository-pattern objectquery

18
推荐指数
1
解决办法
6721
查看次数

JDBI在引号内的查询中使用@bind作为变量

我想知道这是否可行,如果是的话,我确定它是一个简单的解决方案,我似乎无法弄清楚

@SqlQuery("SELECT * FROM Table WHERE column LIKE '%:thingName%'")
public Set<Things> getThings(@Bind("thingName", String thingName)
Run Code Online (Sandbox Code Playgroud)

基本上对于这个玩具示例,我试图选择一个列包含[任何文本] thingName [anyText]的行.当如上使用时,我认为引号模糊了绑定变量,因此它实际上查找[任何文本] :thingName [anyText]而不是我的绑定变量.

先谢谢你,Madeline

objectquery jdbi

14
推荐指数
2
解决办法
4756
查看次数

如何将DBQuery <T>转换为ObjectQuery <T>?

我有一个DBQuery<T>转换为IQueryable<T>(这一点工作正常).但后来我试图将IQueryable转换为ObjectQuery ..它失败了: -

public void Foo(this IQueryable<T> source)
{
    // ... snip ...

    ObjectQuery<T> objectQuery = source as ObjectQuery<T>;
    if (objectQuery != null)
    {
        // ... do stuff ...
    }
}
Run Code Online (Sandbox Code Playgroud)

在我转换到Entity-Framework 4 CTP5 Magic Unicorn等等之前,这曾经工作过.现在,它不起作用 - 即.objectQuerynull.

现在,DBQuery<T> inherits IQueryable<T>..所以我认为这应该工作.

如果我将代码更改为..

var x = (ObjectQuery<T>) source;
Run Code Online (Sandbox Code Playgroud)

然后抛出以下异常: -

System.InvalidCastException:无法转换类型为'System.Data.Entity.Infrastructure.DbQuery 1[Tests.Models.Order]' to type 'System.Data.Objects.ObjectQuery1 [Tests.Models.Order]'的对象.

有什么建议?

.net entity-framework objectquery entity-framework-4

12
推荐指数
2
解决办法
1万
查看次数

将Linq结果直接序列化为JSON

我正在开发一个WebService,它将linq转换为sql db并将结果放入VAR变量中.然后我想使用javascript序列化程序(c#)将VAR中的结果序列化为json格式.像这样的东西:

var sb= from p in ent.people .........
System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new       System.Runtime.Serialization.Json.DataContractJsonSerializer(sb.GetType());
MemoryStream ms = new MemoryStream();
serializer.WriteObject(ms, sb);
string json = System.Text.Encoding.Default.GetString(ms.ToArray());
Run Code Online (Sandbox Code Playgroud)

但是我得到了一个像这样的错误回应:

Type      &#39;System.Data.Objects.ObjectQuery`1[&lt;&gt;f__AnonymousType2d`5[System.String,System.Nu llable`1[System.Int32],System.Nullable`1[System.Int32],System.Int32,System.String]]&#39; cannot be serialized. 
Run Code Online (Sandbox Code Playgroud)

请考虑使用DataContractAttribute属性对其进行标记,并使用DataMemberAttribute属性标记要序列化的所有成员.如果类型是集合,请考虑使用CollectionDataContractAttribute对其进行标记.有关其他受支持的类型,请参阅Microsoft .NET Framework文档.

我如何直接将LINQ结果串行化为JSON?非常感谢所有答案!恩里科

c# linq serialization json objectquery

6
推荐指数
2
解决办法
9824
查看次数

实体SQL比较datetime而不是毫秒

我正在尝试使用带有EntitySQL查询的EntityObject从MSSQL DB中获取一些记录.我用来过滤的字段是日期时间的类型.生成的查询在没有毫秒的情况下投射到SQL Server,不返回任何内容.当我添加毫秒时,我得到结果.

如何在没有毫秒的情况下使用EntitySQL获取结果?

谢谢.

c# t-sql entity-framework objectquery

5
推荐指数
1
解决办法
2809
查看次数

如何使用带有OR子句的Where过滤器的ObjectQuery

有人可以帮我回答如何用ObjectQuery bilder重写原始SQL过滤器WHERE(...)OR(...),好吗?

String queryRaw = "SELECT ls.LocaleName, ls.IsActive, ls.LocaleDescription " +
                  "FROM RoutesEntities.Locales AS ls ";

                  //" WHERE ls.LocaleName = 'en' OR ls.LocaleName = 'de' "

this._queryData = new ObjectQuery<DbDataRecord>(queryRaw, routesModel);
Run Code Online (Sandbox Code Playgroud)

我会使用Where()方法,但它生成where子句用AND分隔,但我想使用OR代替.是否可以使用QueryBilder?我的意思是如何使用它来生成"OR分离"过滤器:

Where("it.LocaleName IN (@localeName)", new ObjectParameter("localeName", String.Join(",", localeName)))
Run Code Online (Sandbox Code Playgroud)

谢谢,阿尔乔姆

c# sql filter where objectquery

5
推荐指数
2
解决办法
2万
查看次数

如何将IQueryable <T>转换为ObjectQuery <T>?

我正在尝试在这篇文章中应用建议:提示22 - 如何使Include真正包括在内

它建议在实体框架(4.2)中确保急切加载的解决方法.该解决方法涉及将IQueryable转换为ObjectQuery.

但是,当我尝试这个时,如帖子所示,查询返回null.

我的查询是(ctx是DbContext):

IEnumerable<Coupon> coupons =
    from x in ctx.Coupons
    where x.LanguageCode.Equals("EN", StringComparison.InvariantCultureIgnoreCase) && x.CategoryId == MainCategoryId && x.Date >= fromDate && x.Date <= toDate
    select x;
Run Code Online (Sandbox Code Playgroud)

这按预期工作.

但是,当我使用时,

IEnumerable<Coupon> coupons =
    (from x in ctx.Coupons
     where x.LanguageCode.Equals("EN", StringComparison.InvariantCultureIgnoreCase) && x.CategoryId == MainCategoryId && x.Date >= fromDate && x.Date <= toDate
     select x) as ObjectQuery<Coupon>;
Run Code Online (Sandbox Code Playgroud)

它为"优惠券"指定了一个空值.

知道我做错了什么吗?

.net c# iqueryable objectquery eager-loading

4
推荐指数
1
解决办法
8201
查看次数

在扩展方法中使用时,DbSet <T> .Include()会导致SELECT N + 1

我在IQueryable上有一个扩展,允许传递分隔的属性名称字符串,当使用时会导致查询不构造JOIN并有效地导致SELECT N + 1问题.

我注意到的是,如果我直接从DbSet调用本机EF扩展名.Include("property"),一切正常.但是,如果我使用我的扩展(我甚至简化它只是调用.Include("property")SELECT N + 1发生...

我的问题是为什么?我究竟做错了什么?

这是调用方法(来自服务)

public MyModel[] GetAll(int page, out int total, int pageSize, string sort, string filter)
{
    return _myModelRepository
        .Get(page, out total, pageSize, sort, filter, "PropertyOnMyModelToInclude")
        .ToArray();
}
Run Code Online (Sandbox Code Playgroud)

这是使用扩展的存储库方法

public virtual IQueryable<T> Get(int page, out int total, int pageSize, string sort, string filter = null, string includes = null)
{
    IQueryable<T> query = DatabaseSet;
    if (!String.IsNullOrWhiteSpace(includes))
    {
        //query.IncludeMany(includes); // BAD: SELECT N+1
        //query.Include(includes); // BAD: SELECT N+1
    }
    if (!String.IsNullOrWhiteSpace(filter))
    {
        query.Where(filter);
    } …
Run Code Online (Sandbox Code Playgroud)

linq-to-entities entity-framework dynamic-linq objectquery

4
推荐指数
1
解决办法
7618
查看次数

ObjectQuery,在Where子句过滤器中传递datetime

如何在这里传递日期时间值?

ObjectQuery<Item> _Query = ItemEntities.CreateQuery<Item>("Item");
_Query = _Query.Where("(it.StartDate >= 11/4/2009 5:06:08 PM)");
Run Code Online (Sandbox Code Playgroud)

我上面的示例代码似乎确实有效.

即便如此

ObjectQuery<Item> _Query = ItemEntities.CreateQuery<Item>("Item");
_Query = _Query.Where("(it.StartDate >= \"11/4/2009 5:06:08 PM\")");
Run Code Online (Sandbox Code Playgroud)

我在EDM中遇到了类型转换错误.

c# objectquery

3
推荐指数
2
解决办法
5806
查看次数

实体框架 - ObjectQuery返回int属性并将其分配给变量

我需要从此查询中获取UserCarId(int)并分配给int类型变量.

 int UserCarId;


 Entities ctx = new Entities();
                var query = from enq in ctx.UserCars.Include("aspnet_Users")
                            where enq.aspnet_Users.UserId == currentUserId
                            select enq.UserCarId ;
                UserCarId = query;
Run Code Online (Sandbox Code Playgroud)

asp.net entity-framework objectquery

3
推荐指数
1
解决办法
2894
查看次数

使用LINQ to Entities时返回IQueryable与ObjectQuery

我一直在阅读时使用LINQ来IQueryable处理查询在处理之前的类型,但是当查询处理完毕后,它不再是一个IQueryable,而是一个ObjectQuery.

在这种情况下,从我的层(存储库层)编写方法以返回IQueryable是否正确?

我需要演员吗?

我为什么要退货ObjectQuery

我来自LINQ to SQL背景,IQueryable但事情总是如此,但EF似乎改变了这一点.

任何帮助真的很感激.

linq-to-entities entity-framework iqueryable objectquery entity-framework-4

3
推荐指数
1
解决办法
3551
查看次数

使用includes展平Entity Framework对象查询结果

我正试图掌握实体框架,有一件事真的让我感到沮丧.我仍然不完全确定术语并没有帮助,我试图避免同时学习LINQ,因此谷歌搜索是困难的.

我有两个表,公司和地址与1对多的关系.如果我写下面的内容:

ObjectQuery<Company> companies = queryContext.Companies.Include("Addresses");
Run Code Online (Sandbox Code Playgroud)

看起来我得到了我想要的东西(公司 - >结果视图[0] .Addresses.Count> 0)

我现在要做的是将公司名称和所有地址绑定到ASP.NET应用程序中的gridview

this.CompaniesGrid.DataSource = companies;
this.CompaniesGrid.DataBind();
Run Code Online (Sandbox Code Playgroud)
<asp:GridView runat="server" ID="CompaniesGrid" AllowSorting="true">
    <Columns>
        <asp:BoundField DataField="Name" />
        <asp:BoundField DataField="Address" />
    </Columns>
</asp:GridView>
Run Code Online (Sandbox Code Playgroud)

这本身就会抛出一个错误(A field or property with the name 'Address' was not found on the selected data source) - 我认为因为公司 - >结果视图[0] .Name存在但.Address不存在(因为它隐藏在地址关系中).绑定到Addresses.Address也没有帮助.

我在这个帖子的底部发现了一个非常难看的解决方法,但如果可能的话我宁愿避免使用它.

有没有办法'展平'我的结果,以便顶级对象为所有包含的字段提供加入?

任何帮助非常感谢!

asp.net entity-framework objectquery

0
推荐指数
1
解决办法
2002
查看次数