【问题标题】:EntityFramework multiple where problemsEntityFramework 多个where问题
【发布时间】:2014-02-13 14:00:59
【问题描述】:

我在后端使用实体框架并在前端使用 jqGrid。我的网格如下所示:

如果我使用这些过滤器之一,我的网格运行完美。 例如:

使用过滤器:“Erfasser” 使用过滤器:“土地”

两个过滤器都工作得很好,但共同的结果是:

我不知道这个问题。这是我的代码:

    using (var db = new ProconContext())
    {
        // Paging für die Liste erstellen, da zuviele Datensätze, user sollte selber über die 
        // größe der Seite bestimmen können.
        var query = db.Belege.Join(db.Kunden, x => x.KundenNr, y => y.KundeId, (x, y) => new { Beleg = x, Kunde = y })
            .Select(x => new BelegKunden { Beleg = x.Beleg, Kunde = x.Kunde });

        db.Configuration.AutoDetectChangesEnabled = false;

        query = query.Where(x => x.Beleg.BelegTypId == belegArtNr);

        foreach (var param in parameters)
        {
            if (param.Key.Equals("BelegId"))
            {
                var belegId = Convert.ToInt32(param.Value);
                query = query.Where(x => x.Beleg.BelegId == belegId);
            }

            if (param.Key == "Name")
            {
                query = query.Where(x => x.Kunde.Name.Contains(param.Value));
            }

            if (param.Key.Equals("Datum"))
            {
                query = query.Where(x => x.Datum.Equals(param.Value));
            }

            if (param.Key.Equals("KundenNr"))
            {
                var kundenNr = Convert.ToInt32(param.Value);
                query = query.Where(x => x.Beleg.KundenNr == kundenNr);
            }

            if (param.Key.Equals("Land"))
            {
                query = query.Where(x => x.Kunde.Land.ZweiBuchstabenIsoCode.Contains(param.Value));
            }

            if (param.Key.Equals("PLZ"))
            {
                query = query.Where(x => x.Kunde.Plz.Contains(param.Value));
            }

            if (param.Key.Equals("Ort"))
            {
                query = query.Where(x => x.Kunde.Ort.Contains(param.Value));
            }

            if (param.Key.Equals("Erfasser"))
            {
                query = query.Where(x => x.Beleg.ErfasstVonUsername.Contains(param.Value));
            }

            if (param.Key.Equals("Kommission"))
            {
                query = query.Where(x => x.Beleg.KopfKommission.Contains(param.Value));
            }

            if (param.Key.Equals("ErstePosition"))
            {
                query = query.Where(x => x.Beleg.ErsteRechnungsPosition.Contains(param.Value));
            }
        }

        var count = query.Count();

        var list = query.OrderByDescending(x => x.Beleg.BelegDatum)
            .Skip(skip) // Wie viele soll er überspringen (die ersten x)
            .Take(take) // Wie viele soll er von da aus nehmen (nimm x)
            .ToList();

        list[0].AllRowsCount = count;
        return AppServerHelper.AppResponse(list);
    }
}
catch (Exception e)
{
    return AppServerHelper.AppResponse(new List<BelegKunden>());
}

在运行时:计数结果对一个过滤器有效,但对 2 个无效。

我正在使用: jqGrid,实体框架

编辑:

Entity Framwework 的自动生成代码在服务器上作为 SQL 语句运行良好。如果我复制自动生成的代码并在服务器上执行它们,我得到了正确的结果,对于两个过滤器。

编辑:

我的模特:

[Serializable]
public partial class Beleg
{
    [LocalizedDisplayName("BelegNr", ModelName = "tbWBI_Reklamationen")]
    public Int32 BelegId { get; set; }

    /// <summary>
    /// Veraltet, BelegId ist nun der Primary Key
    /// </summary>                
    public Int32 AlteBelegId { get; set; }

    public Int16 BelegTypId { get; set; }
    public virtual BelegTyp BelegTyp { get; set; }

    public Int16? LetzterGedruckterBelegTypId { get; set; }
    public virtual BelegTyp LetzterGedruckterBelegTyp { get; set; }

    public Int32 KundenNr { get; set; }

    [LocalizedDisplayName("BelegDatum", ModelName = "tbVKBelege")]
    public DateTime BelegDatum { get; set; }


    public String KopfKommission { get; set; }
    public String ErsteRechnungsPosition { get; set; }
    public String ErfasstVonUsername { get; set; }
    public Double WarenwertBrutto { get; set; }
}

配置:

public class Beleg_Config : EntityTypeConfiguration<Beleg>
{
    public Beleg_Config()
    {
        ToTable("tbVKBelege");

        HasKey(a => a.BelegId);
        Property(a => a.BelegId)
            .HasColumnName("BelegNr")
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
            .IsRequired();

        Property(a => a.AlteBelegId).HasColumnName("");

        Property(a => a.BelegTypId).HasColumnName("");

        Property(a => a.LetzterGedruckterBelegTypId).HasColumnName("");

        Property(a => a.ErsteRechnungsPosition).HasColumnName("");

        Property(a => a.ErfasstVonUsername).HasColumnName("");

        Property(a => a.WarenwertBrutto).HasColumnName("");


        HasRequired(b => b.BelegTyp).WithMany().HasForeignKey(b => b.BelegTypId);

        HasOptional(b => b.LetzterGedruckterBelegTyp).WithMany().HasForeignKey(b => b.LetzterGedruckterBelegTypId);            
    }
}

昆德配置:

public Kunde_Config()
{
    ToTable("tbKunden");

    HasKey(a => a.KundeId);
    Property(a => a.KundeId).HasColumnName("KundenNr").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

    /*Property(a => a.KundeId)
        .HasColumnName("KundenNr")
        .
        .IsRequired();*/

    Property(a => a.AussendienstlerId).HasColumnName("");

    Property(x => x.SpezialSbUserId).HasColumnName("");

    Property(a => a.Name).HasColumnName("");

    Property(a => a.Name2).HasColumnName("");

    Property(a => a.Straße).HasColumnName("");

    Property(a => a.TelefonNr).HasColumnName("");

    Property(a => a.FaxNr).HasColumnName("");

    Property(a => a.Website).HasColumnName("");

    Property(a => a.KeyAccountManagerId).HasColumnName("");

    Property(a => a.KWFP).HasColumnName("KWFP");

    Property(a => a.IOHomeControl).HasColumnName("IOHomeControl");

    Property(a => a.TopPartner).HasColumnName("");

    Property(x => x.ZahlungsbedingungId).HasColumnName("");

    Property(x => x.EShop).HasColumnName("");

    Property(x => x.EShopUsername).HasColumnName("");

    Property(x => x.EShopPasswort).HasColumnName("");

    Property(x => x.Quelle).HasColumnName("");

    Property(x => x.Kommentar).HasColumnName("");

    Property(x => x.Rabatt).HasColumnName("");

    Property(x => x.IstBaanKunde).HasColumnName("");

    Property(x => x.HatAltschulden).HasColumnName("");

    Property(x => x.StandardLieferadressenNr).HasColumnName("");

    Property(x => x.IstWettbewerber).HasColumnName("");

    HasRequired(b => b.AußendienstMitarbeiter).WithMany().HasForeignKey(b => b.k);
    HasRequired(b => b.Land).WithMany().HasForeignKey(b => b.LandId);
    HasOptional(b => b.KeyAccountManager).WithMany().HasForeignKey(b => b.k);
    // HasOptional(x => x.Messedaten);
}

出于安全考虑,我删除了配置数据中的“列名”,对此深表歉意。

【问题讨论】:

  • 嗨,试试不加入。
  • 没有加入它的工作正常,但我需要一些来自“Kunde”的信息。
  • 如果可以的话,请发布模型以获得更多理解,但我相信问题出在您正在制作的加入中。
  • 我会尽快发布模型。这有点奇怪,但是:如果我在我的 SQL 视图上创建一个“SQL 视图”并选择带有我的 wheres 的视图,我遇到了同样的问题。
  • KundenNr == KundenId Kunden表的主键?

标签: c# entity-framework jqgrid


【解决方案1】:

首先:感谢 emcas88 的时间和帮助!

我用你的想法解决了这个问题: 仅选择字段 AND:

var query = db.Beleg.Join(
                db.Kunden,
                x => new { x.KundenNr }, //the outer selector, the foreing key to Kunden
                y => new { y.KundeId }, //the inner selector, the primary key in Kunde, this will match x.KundenNr == y.KundenId
                (x,y) => new { BelegNr = x.BelegId , BelegDatum = x.BelegDatum, Name = y.Name .....}); //here you select the columns(fields) in each table, and construct the new anonymous object with the fields that you need in each table

另一个问题是: 我需要改变这个:

foreach (var param in parameters)
    {
        if (param.Key.Equals("BelegId"))
        {
            var belegId = Convert.ToInt32(param.Value);
            query = query.Where(x => x.Beleg.BelegId == belegId);
        }

        if (param.Key == "Name")
        {
            query = query.Where(x => x.Kunde.Name.Contains(param.Value));
        }

        if (param.Key.Equals("Datum"))
        {
            query = query.Where(x => x.Datum.Equals(param.Value));
        }

        if (param.Key.Equals("KundenNr"))
        {
            var kundenNr = Convert.ToInt32(param.Value);
            query = query.Where(x => x.Beleg.KundenNr == kundenNr);
        }

        if (param.Key.Equals("Land"))
        {
            query = query.Where(x => x.Kunde.Land.ZweiBuchstabenIsoCode.Contains(param.Value));
        }

        if (param.Key.Equals("PLZ"))
        {
            query = query.Where(x => x.Kunde.Plz.Contains(param.Value));
        }

        if (param.Key.Equals("Ort"))
        {
            query = query.Where(x => x.Kunde.Ort.Contains(param.Value));
        }

        if (param.Key.Equals("Erfasser"))
        {
            query = query.Where(x => x.Beleg.ErfasstVonUsername.Contains(param.Value));
        }

        if (param.Key.Equals("Kommission"))
        {
            query = query.Where(x => x.Beleg.KopfKommission.Contains(param.Value));
        }

        if (param.Key.Equals("ErstePosition"))
        {
            query = query.Where(x => x.Beleg.ErsteRechnungsPosition.Contains(param.Value));
        }
    }

进入这个:

if (parameters.ContainsKey("BelegId"))
                {
                    var belegId = Convert.ToInt32(parameters["BelegId"]);
                    query = query.Where(x => x.BelegId == belegId);
                }

                if (parameters.ContainsKey("Name"))
                {
                    var tmp = parameters["Name"];
                    query = query.Where(x => x.Name.Contains(tmp));
                }

                if (parameters.ContainsKey("Datum"))
                {
                    var tmp = parameters["Name"];
                    query = query.Where(x => x.BelegDatum.Equals(tmp));
                }

                if (parameters.ContainsKey("KundenNr"))
                {
                    var kundenNr = Convert.ToInt32(parameters["KundenNr"]);
                    query = query.Where(x => x.KundenNr == kundenNr);
                }

                if (parameters.ContainsKey("Land"))
                {
                    var tmp = parameters["Land"];
                    query = query.Where(x => x.Land.ZweiBuchstabenIsoCode.Contains(tmp));
                }

                if (parameters.ContainsKey("PLZ"))
                {
                    var tmp = parameters["PLZ"];
                    query = query.Where(x => x.Plz.Contains(tmp));
                }

                if (parameters.ContainsKey("Ort"))
                {
                    var tmp = parameters["Ort"];
                    query = query.Where(x => x.Ort.Contains(tmp));
                }

                if (parameters.ContainsKey("Erfasser"))
                {
                    var tmp = parameters["Erfasser"];
                    query = query.Where(x => x.ErfasstVonUsername.Contains(tmp));
                }

                if (parameters.ContainsKey("Kommission"))
                {
                    var tmp = parameters["Kommission"];
                    query = query.Where(x => x.KopfKommission.Contains(tmp));
                }

                if (parameters.ContainsKey("ErstePosition"))
                {
                    var tmp = parameters["ErstePosition"];
                    query = query.Where(x => x.ErsteRechnungsPosition.Contains(tmp));
                }

我猜问题出在 foreach 循环上。 循环执行了两次查询,在第二个代码块中,查询在函数结束时执行。

【讨论】:

    【解决方案2】:

    我相信我遇到了您的问题,当您进行连接时,您正在以错误的方式创建匿名类型,请这样做:

    var query = db.Beleg.Join(
                    db.Kunden,
                    x => new { x.KundenNr }, //the outer selector, the foreing key to Kunden
                    y => new { y.KundeId }, //the inner selector, the primary key in Kunde, this will match x.KundenNr == y.KundenId
                    (x,y) => new { BelegNr = x.BelegId , BelegDatum = x.BelegDatum, Name = y.Name .....}); //here you select the columns(fields) in each table, and construct the new anonymous object with the fields that you need in each table
    

    这里有一些链接可以帮助你更多地理解

    http://msdn.microsoft.com/en-us/library/bb534675(v=vs.110).aspx
    http://msdn.microsoft.com/en-us/library/bb534675%28v=vs.110%29.aspx http://www.w3schools.com/sql/sql_join.asp

    LINQ: How to do JOIN using the linq extension method style on multiple fields?

    我在分析,在您的情况下,您不需要连接,连接用于选择您要连接的每个表的几个字段,但在这里您保留两个整体表。我的建议是使用简单的 where 子句。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2010-12-09
      • 2011-04-21
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 2021-09-06
      相关资源
      最近更新 更多