C# EntityFramework存在多个问题

C# EntityFramework存在多个问题,c#,entity-framework,jqgrid,C#,Entity Framework,Jqgrid,我在后端使用实体框架,在前端使用jqGrid。我的网格如下所示: 如果我使用这些过滤器中的一个,我的网格工作得很好。 例如: 使用过滤器:“Erfasser” 使用过滤器:“土地” 两个过滤器都工作得很好,但我有以下共同的结果: 我对这个问题一无所知。这是我的密码: using (var db = new ProconContext()) { // Paging für die Liste erstellen, da zuviele Datensätze,

我在后端使用实体框架,在前端使用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>());
}

为了安全起见,我删除了配置数据中的“columnnames”,很抱歉

我想我明白了你的问题,当你加入时,你以错误的方式创建了匿名类型,请这样做:

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
这里有一些链接可以帮助您更好地理解


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


希望能有所帮助。

首先:感谢emcas88为您提供的时间和帮助

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

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循环。
循环将执行两次查询,在第二个代码块中,查询将在函数末尾执行。

您好,请尝试不使用联接。不使用联接可以正常工作,但我需要“Kunde”提供的一些信息。如果可以的话,请发布模型以了解更多信息,但我相信问题在于你的加入。我会尽快发布模型。这有点奇怪,但是:如果我在我的SQL视图上创建一个“SQL视图”,并选择带有where的视图,我会遇到同样的问题。KundenNr==KundenId是Kunden表的主键吗?
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));
                }