порядок данных по релевантности, используя linq по значениям столбцов, которые разделены запятыми - PullRequest
1 голос
/ 31 августа 2010

У меня есть Datatable, который содержит столбец с именем Теги, теги могут иметь значения, такие как

row[0] = Tag1
row[1] = Tag1, Tag2
row[2] = Tag2, Tag3
row[3] = Tag1, Tag2, Tag3
row[4] = Tag4, Tag6

и разделены запятыми

и т.д ..

У меня есть значение тегов для текущего документа, и я выполнил запрос, чтобы выбрать все другие документы, в которых есть один из тегов в строке. Например, допустим, что текущие теги документа (Tag1, Tag2, Tag3)

, поэтому из примера строки выше всех строк выше возвращаются отдельно от строки [4]

Вот бит, с которым я потерян, теперь я хочу отсортировать данные по количеству тегов, совпадающих с текущим документом. так что для примера, о котором я говорил, они должны быть заказаны

row[3] = Tag1, Tag2, Tag3
row[1] = Tag1, Tag2
row[2] = Tag2, Tag3
row[0] = Tag1

Ранее не использовал linq, но ему сказали, что он может это сделать.

пока у меня есть

var query = from c in dt.AsEnumerable()
                    orderby c.Field<string>("Tags").CompareTo(dr["Tags"]) ascending
                    select c;

Ответы [ 3 ]

2 голосов
/ 31 августа 2010

Используйте метод пересечения. вот образец

//test data
DataTable table = new DataTable();
        var column = table.Columns.Add("Tags", typeof(string));
        table.Rows.Add("Tag1");
        table.Rows.Add("Tag1,Tag2");
        table.Rows.Add("Tag2,Tag3");
        table.Rows.Add("Tag1,Tag2,Tag3");
        table.Rows.Add("Tag4,Tag6");
        string[] currentTags = new string[] { "Tag1", "Tag2", "Tag3" };

//actual code
        var a = from row in table.AsEnumerable()
                let cData = (row["Tags"] as string).Split(new char[] { ',' }).Intersect(currentTags)
                orderby cData.Count() descending
                select cData;
1 голос
/ 31 августа 2010

Я думаю, что-то подобное будет отвечать всем требованиям.Попробуйте:

// Here, I construct a simple table for demonstration
var table = new DataTable();
var column = table.Columns.Add("Tags", typeof(string));
table.Rows.Add("Tag1");
table.Rows.Add("Tag1, Tag2");
table.Rows.Add("Tag2, Tag3");
table.Rows.Add("Tag1, Tag2, Tag3");
table.Rows.Add("Tag4, Tag6");

// The separator is convenient for using the string.Split override
// that strips empty results
var separator = new[] { ",", " " };

// For the demo, we'll sort by number of tags matching the third row
var current = table.Rows[2];

// This splits the string into an array for convenient processing later
var currenttags = current.Field<string>("Tags")
                         .Split(separator, StringSplitOptions.RemoveEmptyEntries);

// The query splits out each tags field into an array convenient for processing,
// counts the number of tags contained in the currenttags array,
// sorts, and then selects the entire row.
var query = from row in table.AsEnumerable()
            let tags = row.Field<string>("Tags")
                          .Split(separator, StringSplitOptions.RemoveEmptyEntries)
            let count = tags.Count(t => currenttags.Contains(t))
            orderby count descending
            select row;
0 голосов
/ 01 сентября 2010
        string[] Tags = dr["Tags"].ToString().Split(new char[] { ',' });
        string SqlClause = "";

        for (int i = 0; i < Tags.Length; i++)
        {
            if (i != Tags.Length - 1)
            {
                SqlClause += "Tags LIKE '%" + Tags[i] + "%' OR ";
            }
            else
            {
                SqlClause += "Tags LIKE '%" + Tags[i] + "%'";
            }
        }

        DataTable dt = ArticleCollection(SqlClause);

        var seperator = new[] { ",", " " };
        var current = dr["Tags"].ToString();
        var currenttags = dr.Field<string>("Tags").Split(seperator, StringSplitOptions.RemoveEmptyEntries);

        DataTable query = (from row in dt.AsEnumerable()
                    let tags = row.Field<string>("Tags").Split(seperator, StringSplitOptions.RemoveEmptyEntries)
                    let count = tags.Count(t => currenttags.Contains(t))
                    orderby count descending
                    select row).CopyToDataTable();

        for (int i = 0; i < query.Rows.Count; i++)
        {
            if (query.Rows[i]["Title"].ToString() == dr["Title"].ToString())
            {
                query.Rows[i].Delete();
            }
        }

        TagsRepeater.DataSource = query;
        TagsRepeater.DataBind();

    }
}

DataTable ArticleCollection(string whereClause)
{

    DataSet ds = TreeHelper.SelectNodes("/%", false, "CriticalCare.Conclusion;CriticalCare.Literature;CriticalCare.Theory", whereClause, " ", -1, true);
    DataTable dt = new DataTable();

    if (!DataHelper.DataSourceIsEmpty(ds))
    {            
        for (int i = 0; i < ds.Tables.Count; i++)
        {
            dt.Merge(ds.Tables[i]);
        }
        return dt;
    }
    return null;
}

}

также, что я хочу сделать, если несколько статей соответствуют одному и тому же количеству тегов, это упорядочить их по порядку относительно текущего документа в дереве сайта. какой бит linq я бы сделал это с? это легко сделать в том же запросе? Можно ли добавить столбец подсчета в таблицу данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...